package main

import (
	"fmt"
	"encoding/binary"
)

// 校验和计算函数（CHKSUM）
func calculateChecksum(data []byte) []byte {
	var sum int32
	for _, b := range data {
		sum += int32(b)
	}
	checksum := sum % 65536
	checksum = ^checksum + 1
	return []byte{byte(checksum >> 8), byte(checksum & 0xFF)}
}

// 构建设定系统参数命令帧
func buildSetSystemParametersCommand() []byte {
	soi := []byte{0x7E}    // SOI
	ver := []byte{0x21}    // VER
	adr := []byte{0x01}    // ADR
	cid1 := []byte{0x60}   // CID1: 设备类型 - 分散空调
	cid2 := []byte{0x49}   // CID2: 设置系统参数命令
	length := []byte{0x00, 0x06} // LENGTH (LENID=6)
	
	// COMMAND INFO: 设置空调参数（假设温度为24.0℃，湿度为60%）
	commandType := []byte{0x10} // 设定空调温度（举例）
	commandData := []byte{0x00, 0xF0} // 24.0℃ 设置为 0x00F0（240）

	// 拼接 COMMAND INFO
	commandInfo := append(commandType, commandData...)
	
	checksum := calculateChecksum(append(soi, append(ver, append(adr, append(cid1, append(cid2, append(length, append(commandInfo, ...))))))))
	eoi := []byte{0x0D}    // EOI

	// 拼接完整的命令帧
	commandFrame := append(soi, append(ver, append(adr, append(cid1, append(cid2, append(length, append(commandInfo, append(checksum, eoi...)...)...)...)...)
	return commandFrame
}

// 构建设定系统参数响应帧
func buildSetSystemParametersResponse(returnCode byte) []byte {
	soi := []byte{0x7E}    // SOI
	ver := []byte{0x21}    // VER
	adr := []byte{0x01}    // ADR
	cid1 := []byte{0x60}   // CID1: 设备类型 - 分散空调
	rtc := []byte{returnCode} // RTN: 返回码
	length := []byte{0x00, 0x00} // LENGTH (LENID=0)
	checksum := calculateChecksum(append(soi, append(ver, append(adr, append(cid1, append(rtc, append(length, ...)))))))
	eoi := []byte{0x0D}    // EOI

	// 拼接完整的响应帧
	responseFrame := append(soi, append(ver, append(adr, append(cid1, append(rtc, append(length, append(checksum, eoi...)...)...)...)
	return responseFrame
}

func main() {
	// 示例：构建设定系统参数命令
	commandFrame := buildSetSystemParametersCommand()
	fmt.Printf("设定系统参数命令帧: %X\n", commandFrame)

	// 示例：构建设定系统参数响应帧，假设返回值为0
	responseFrame := buildSetSystemParametersResponse(0x00)
	fmt.Printf("设定系统参数响应帧: %X\n", responseFrame)
}
